public class Main3 {
    private static int[][] dp = new int[3000][3000];

    public static void main(String[] args) {
        System.out.println(dp(3, 1000));
    }
    private static int dp(int m, int n) {

        if (m == 1){ return n;}
        if (n == 0) {return 0; }
        // 如果已经计算过，直接返回结果
        if (dp[m][n] != 0) {
            return dp[m][n];
        }
        // 初始化 dp[m][n] 为最大值（因为要取最小值）
        dp[m][n] = Integer.MAX_VALUE;

        // 遍历所有可能的测试楼层 i
        for (int i = 1; i <= n; i++) {
            dp[m][n] = Math.min(dp[m][n], Math.max(dp(m, n - i), dp(m - 1, i - 1)) + 1);  // 当前测试次数 +1);
        }

        return dp[m][n];
    }
}